import { defineStore } from 'pinia'
import service from '../../utils/request'
import router from '../../router'
import type { UserInfo } from '../../types/app.d'

// User Store 接口
interface UserState {
  userInfo: UserInfo | null
  token: string | null
  isAuthenticated: boolean
}

export const useUserStore = defineStore('user', {
  state: (): UserState => ({
    userInfo: {
      id: '1',
      username: 'admin',
      nickname: 'admin',
      email: 'admin@example.com',
      avatar: '',
      roles: ['admin'],
      permissions: ['*'],
      createTime: new Date().toISOString(),
      updateTime: new Date().toISOString()
    },
    token: localStorage.getItem('token'),
    isAuthenticated: !!localStorage.getItem('token')
  }),

  getters: {
    // 获取用户信息
    getUserInfo(): UserInfo | null {
      return this.userInfo
    },

    // 获取用户角色
    getUserRoles(): string[] {
      return this.userInfo?.roles || []
    },

    // 获取用户权限
    getUserPermissions(): string[] {
      return this.userInfo?.permissions || []
    }
  },

  actions: {
    // 登录
    async login(username: string, password: string): Promise<boolean> {
      try {
        // 在实际项目中，这里应该调用真实的登录 API
        const response = await service.post('/login', {
          username,
          password
        })

        // 保存 token - 处理两种可能的响应格式
        let token: string
        if (response.data.data && response.data.data.token) {
          // 格式: { code: 200, message: '...', data: { token: '...' } }
          token = response.data.data.token
        } else if (response.data.token) {
          // 格式: { code: 200, message: '...', token: '...' }
          token = response.data.token
        } else {
          console.error('登录响应中未找到token');
          return false
        }

        this.token = token
        this.isAuthenticated = true
        localStorage.setItem('token', token)

        // 获取用户信息
        await this.getUserInfoAction()

        return true
      } catch (error) {
        console.error('登录失败:', error)
        return false
      }
    },

    // 登出
    logout(): void {
      this.token = null
      this.userInfo = null
      this.isAuthenticated = false
      localStorage.removeItem('token')
      router.push('/login')
    },

    // 获取用户信息
    async getUserInfoAction(): Promise<void> {
      try {
        if (!this.token) return

        // 在实际项目中，这里应该调用真实的获取用户信息 API
        // 这里使用模拟数据进行演示
        const response = await service.get('/user/info')
        
        // 适配不同的响应格式
        const userInfoData = response.data.data || response.data
        this.userInfo = userInfoData
        // 获取用户信息成功
      } catch (error) {
        console.error('获取用户信息失败:', error)
      }
    },

    // 初始化用户信息（用于应用启动时）
    async initUserInfo(): Promise<void> {
      try {
        const token = localStorage.getItem('token')
        if (token) {
          this.token = token
          this.isAuthenticated = true
          await this.getUserInfoAction()
        }
      } catch (error) {
        console.error('初始化用户信息失败:', error)
        // 初始化失败时，清除token和认证状态
        this.logout()
      }
    },

    // 更新用户信息
    async updateUserInfo(userInfo: Partial<UserInfo>): Promise<boolean> {
      try {
        // 在实际项目中，这里应该调用真实的更新用户信息 API
        // 这里使用模拟数据进行演示
        // const response = await service.put('/user/info', userInfo)
        
        // 模拟成功响应
        if (this.userInfo) {
          // 合并更新用户信息
          this.userInfo = { ...this.userInfo, ...userInfo }
        }
        
        // 用户信息更新成功
        return true
      } catch (error) {
        console.error('用户信息更新失败:', error)
        return false
      }
    }
  }
})